From 7ae5a56948e5124eabd558438ff29187f5721819 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?utf8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Thu, 10 Apr 2014 08:48:13 +0000 Subject: [PATCH] W32: Implement composition check for GDK Also move DWM function grabbing and make those functions available to all of GDK-Win32. https://bugzilla.gnome.org/show_bug.cgi?id=727316 --- gdk/win32/gdkmain-win32.c | 29 +++++++++++++++++++++++++++++ gdk/win32/gdkprivate-win32.h | 10 ++++++++++ gdk/win32/gdkscreen-win32.c | 17 +++++++++++++++++ gtk/gtkwindow.c | 3 +++ 4 files changed, 59 insertions(+) diff --git a/gdk/win32/gdkmain-win32.c b/gdk/win32/gdkmain-win32.c index 905c729fab..5011817f22 100644 --- a/gdk/win32/gdkmain-win32.c +++ b/gdk/win32/gdkmain-win32.c @@ -48,6 +48,12 @@ static gboolean gdk_synchronize = FALSE; static gboolean dummy; +#ifdef HAVE_W32_DWM +static HMODULE dwmdll = NULL; +PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow = NULL; +PFN_DwmIsCompositionEnabled dwmIsCompositionEnabled = NULL; +#endif + const GOptionEntry _gdk_windowing_args[] = { { "sync", 0, 0, G_OPTION_ARG_NONE, &gdk_synchronize, /* Description of --sync in --help output */ N_("Don't batch GDI requests"), NULL }, @@ -132,6 +138,29 @@ _gdk_win32_windowing_init (void) _cf_text_html = RegisterClipboardFormat ("text/html"); _gdk_win32_selection_init (); + +/* HAVE_W32_DWM means that we have necessary declarations at compile-time, + * but we'd still like to be able to run on XP, so we'll load the functions + * we need at runtime. + */ +#ifdef HAVE_W32_DWM + if (dwmdll == NULL) + { + dwmdll = LoadLibraryA ("dwmapi.dll"); + if (dwmdll == NULL) + { + /* This will make sure that we only try this once */ + dwmdll = INVALID_HANDLE_VALUE; + } + else + { + dwmEnableBlurBehindWindow = (PFN_DwmEnableBlurBehindWindow) + GetProcAddress (dwmdll, "DwmEnableBlurBehindWindow"); + dwmIsCompositionEnabled = (PFN_DwmIsCompositionEnabled) + GetProcAddress (dwmdll, "DwmIsCompositionEnabled"); + } + } +#endif } void diff --git a/gdk/win32/gdkprivate-win32.h b/gdk/win32/gdkprivate-win32.h index acc3fcac05..2482c5d336 100644 --- a/gdk/win32/gdkprivate-win32.h +++ b/gdk/win32/gdkprivate-win32.h @@ -41,6 +41,15 @@ #include "config.h" +#ifdef HAVE_W32_DWM +#include +typedef HRESULT (WINAPI *PFN_DwmEnableBlurBehindWindow)(HWND, + const DWM_BLURBEHIND *); +typedef HRESULT (WINAPI *PFN_DwmIsCompositionEnabled)(BOOL *pfEnabled); +extern PFN_DwmEnableBlurBehindWindow dwmEnableBlurBehindWindow; +extern PFN_DwmIsCompositionEnabled dwmIsCompositionEnabled; +#endif + /* Make up for some minor w32api or MSVC6 header lossage */ #ifndef PS_JOIN_MASK @@ -496,6 +505,7 @@ gchar *_gdk_win32_display_manager_get_atom_name (GdkDisplayManager *manager, GdkAtom atom); void _gdk_win32_append_event (GdkEvent *event); void _gdk_win32_emit_configure_event (GdkWindow *window); +gboolean _gdk_win32_is_desktop_composition_enabled (); /* Initialization */ void _gdk_win32_windowing_init (void); diff --git a/gdk/win32/gdkscreen-win32.c b/gdk/win32/gdkscreen-win32.c index d2c2dea1b7..2ab8801ad3 100644 --- a/gdk/win32/gdkscreen-win32.c +++ b/gdk/win32/gdkscreen-win32.c @@ -174,6 +174,23 @@ gdk_win32_screen_is_composited (GdkScreen *screen) { g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE); + return _gdk_win32_is_desktop_composition_enabled (); +} + +gboolean +_gdk_win32_is_desktop_composition_enabled () +{ + BOOL b; + DWORD sysver, major, minor; + sysver = GetVersion (); + major = (DWORD)(LOBYTE (LOWORD (sysver))); + minor = (DWORD)(HIBYTE (LOWORD (sysver))); + /* Composition is always enabled in W8 */ + if (major >= 6 && minor >= 2) + return TRUE; + + if (dwmIsCompositionEnabled && (S_OK == dwmIsCompositionEnabled (&b))) + return b; return FALSE; } diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index d7911869bf..9104fede9c 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -3630,6 +3630,9 @@ gdk_window_supports_csd (GtkWindow *window) screen = gtk_widget_get_screen (widget); + if (!gdk_screen_is_composited (screen)) + return FALSE; + /* We need a visual with alpha */ visual = gdk_screen_get_rgba_visual (screen); if (!visual) -- 2.30.2